import os
from pathlib import Path
from pdf2image import convert_from_path

def convert_pdf_to_images(pdf_path, output_dir=None, dpi=300):
    """将PDF文件转换为图片
    
    Args:
        pdf_path: PDF文件路径
        output_dir: 输出目录路径，默认为PDF所在目录下的同名文件夹
        dpi: 输出图片的DPI，默认300
    
    Returns:
        bool: 转换是否成功
    """
    try:
        # 确保PDF文件存在
        pdf_path = Path(pdf_path)
        if not pdf_path.exists():
            print(f"错误：PDF文件 '{pdf_path}' 不存在")
            return False
        
        # 设置输出目录
        if output_dir is None:
            output_dir = pdf_path.parent / pdf_path.stem
        else:
            output_dir = Path(output_dir)
        
        # 创建输出目录
        output_dir.mkdir(exist_ok=True, parents=True)
        
        print(f"开始处理PDF文件：{pdf_path}")
        print(f"输出目录：{output_dir}")
        
        # 将PDF转换为图片
        print("正在将PDF转换为图片...")
        images = convert_from_path(pdf_path, dpi=dpi)
        
        # 保存图片
        for i, image in enumerate(images):
            output_path = output_dir / f"page_{i:03d}.png"
            image.save(output_path, 'PNG')
            print(f"已保存第 {i+1} 页：{output_path}")
        
        print(f"\n转换完成！共转换 {len(images)} 页")
        print(f"所有图片已保存到：{output_dir}")
        return True
    
    except Exception as e:
        print(f"转换过程中出错：{str(e)}")
        import traceback
        print(f"错误详情：\n{traceback.format_exc()}")
        return False

def process_directory(dir_path, dpi=300):
    """处理目录下的所有PDF文件
    
    Args:
        dir_path: 目录路径
        dpi: 输出图片的DPI
    
    Returns:
        tuple: (成功数量, 失败数量)
    """
    dir_path = Path(dir_path)
    if not dir_path.is_dir():
        print(f"错误：'{dir_path}' 不是有效目录")
        return (0, 0)
    
    # 查找所有PDF文件
    pdf_files = list(dir_path.glob('**/*.pdf'))
    if not pdf_files:
        print("未找到任何PDF文件")
        return (0, 0)
    
    print(f"找到 {len(pdf_files)} 个PDF文件")
    success_count = 0
    failed_count = 0
    
    # 处理每个PDF文件
    for i, pdf_file in enumerate(pdf_files, 1):
        print(f"\n正在处理 ({i}/{len(pdf_files)}): {pdf_file.name}")
        output_dir = pdf_file.parent / pdf_file.stem
        
        if convert_pdf_to_images(pdf_file, output_dir, dpi):
            success_count += 1
        else:
            failed_count += 1
    
    print(f"\n处理完成！成功：{success_count}，失败：{failed_count}")
    return (success_count, failed_count)

def main():
    print("PDF转图片工具")
    print("-" * 20)
    
    # 获取用户输入
    while True:
        path = input("请输入PDF文件或目录路径：").strip()
        if not path:
            print("请输入有效路径")
            continue
            
        path = Path(path)
        if path.is_file() and path.suffix.lower() == '.pdf':
            break
        elif path.is_dir():
            break
        else:
            print("请输入有效的PDF文件或目录路径")
    
    # 获取DPI设置（可选）
    while True:
        dpi_input = input("请输入图片DPI（可选，直接回车使用默认值300，建议范围300-1200）：").strip()
        if not dpi_input:
            dpi = 300
            break
        try:
            dpi = int(dpi_input)
            if dpi > 0:
                if dpi < 300:
                    print("警告：DPI值过低可能影响图像质量，建议使用300以上的值")
                elif dpi > 1200:
                    print("警告：DPI值过高可能导致处理时间较长和文件体积较大")
                break
            print("DPI必须大于0")
        except ValueError:
            print("请输入有效的数字")
    
    print("\n开始转换，请稍候...")
    print("注意：高DPI值会产生更高质量的图像，但也会增加处理时间和文件大小")
    
    # 根据输入路径类型执行相应的转换
    if path.is_file():
        convert_pdf_to_images(path, None, dpi)
    else:
        process_directory(path, dpi)

if __name__ == "__main__":
    main()